const Joi = require('joi');

// 用户注册数据验证规则
const registerSchema = Joi.object({
  username: Joi.string().pattern(/^[a-zA-Z][a-zA-Z0-9_]{5,}$/).required().messages({
    'string.pattern.base': '用户名必须以字母开头，长度至少6个字符，只能包含字母、数字、下划线',
    'any.required': '用户名不能为空'
  }),
  password: Joi.string().pattern(/^[a-zA-Z][a-zA-Z0-9_@]{5,19}$/).required().messages({
    'string.pattern.base': '密码必须以字母开头，长度6-20位，只能包含字母、数字、下划线、@',
    'any.required': '密码不能为空'
  }),
  confirmPassword: Joi.string().valid(Joi.ref('password')).required().messages({
    'any.only': '两次输入的密码不一致',
    'any.required': '确认密码不能为空'
  }),
  role: Joi.string().valid('citizen', 'admin').required().messages({
    'any.only': '用户角色只能是村民或管理员',
    'any.required': '用户角色不能为空'
  })
});

// 用户登录数据验证规则
const loginSchema = Joi.object({
  loginIdentifier: Joi.string().required().messages({
    'any.required': '登录标识不能为空'
  }),
  password: Joi.string().required().messages({
    'any.required': '密码不能为空'
  }),
  role: Joi.string().valid('citizen', 'admin').required().messages({
    'any.only': '用户角色只能是村民或管理员',
    'any.required': '用户角色不能为空'
  })
});

// 重置密码数据验证规则
const resetPasswordSchema = Joi.object({
  loginIdentifier: Joi.string().required().messages({
    'any.required': '登录标识不能为空'
  }),
  oldPassword: Joi.string().optional().messages({
    'string.base': '原密码格式不正确'
  }),
  newPassword: Joi.string().pattern(/^[a-zA-Z][a-zA-Z0-9_@]{5,19}$/).required().messages({
    'string.pattern.base': '新密码必须以字母开头，长度6-20位，只能包含字母、数字、下划线、@',
    'any.required': '新密码不能为空'
  }),
  confirmPassword: Joi.string().valid(Joi.ref('newPassword')).required().messages({
    'any.only': '两次输入的新密码不一致',
    'any.required': '确认密码不能为空'
  })
});

// 校验用户是否存在数据验证规则
const validateUserSchema = Joi.object({
  loginIdentifier: Joi.string().required().messages({
    'any.required': '登录标识不能为空'
  })
});

// 修改个人信息数据验证规则
const updateProfileSchema = Joi.object({
  loginIdentifier: Joi.string().required().messages({
    'any.required': '登录标识不能为空'
  }),
  name: Joi.string().max(100).optional().allow('').messages({
    'string.max': '姓名不能超过100个字符'
  }),
  idCard: Joi.string().pattern(/^[1-9]\d{5}(18|19|20)\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/).optional().allow('').messages({
    'string.pattern.base': '身份证号码格式不正确'
  }),
  gender: Joi.string().valid('male', 'female', 'other').optional().allow('').messages({
    'any.only': '性别只能是male、female或other'
  }),
  birthDate: Joi.date().optional().allow('').messages({
    'date.base': '出生日期格式不正确'
  }),
  phone: Joi.string().pattern(/^1[3-9]\d{9}$/).optional().allow('').messages({
    'string.pattern.base': '手机号格式不正确'
  }),
  province: Joi.string().max(50).optional().allow('').messages({
    'string.max': '省份不能超过50个字符'
  }),
  city: Joi.string().max(50).optional().allow('').messages({
    'string.max': '城市不能超过50个字符'
  }),
  county: Joi.string().max(50).optional().allow('').messages({
    'string.max': '县区不能超过50个字符'
  }),
  village: Joi.string().max(100).optional().allow('').messages({
    'string.max': '村庄不能超过100个字符'
  }),
  address: Joi.string().max(200).optional().allow('').messages({
    'string.max': '详细地址不能超过200个字符'
  }),
  postalCode: Joi.string().pattern(/^\d{6}$/).optional().allow('').messages({
    'string.pattern.base': '邮政编码格式不正确'
  }),
  avatar: Joi.string().uri().optional().allow('').messages({
    'string.uri': '头像URL格式不正确'
  })
});

// 绑定邮箱数据验证规则
const bindEmailSchema = Joi.object({
  loginIdentifier: Joi.string().required().messages({
    'any.required': '登录标识不能为空'
  }),
  email: Joi.string().email().required().messages({
    'string.email': '邮箱格式不正确',
    'any.required': '邮箱不能为空'
  }),
  password: Joi.string().pattern(/^[a-zA-Z][a-zA-Z0-9_@]{5,19}$/).required().messages({
    'string.pattern.base': '密码必须以字母开头，长度6-20位，只能包含字母、数字、下划线、@',
    'any.required': '密码不能为空'
  })
});

// 解绑邮箱数据验证规则
const unbindEmailSchema = Joi.object({
  loginIdentifier: Joi.string().required().messages({
    'any.required': '登录标识不能为空'
  }),
  password: Joi.string().pattern(/^[a-zA-Z][a-zA-Z0-9_@]{5,19}$/).required().messages({
    'string.pattern.base': '密码必须以字母开头，长度6-20位，只能包含字母、数字、下划线、@',
    'any.required': '密码不能为空'
  })
});

// 禁用用户数据验证规则
const disableUserSchema = Joi.object({
  userId: Joi.number().integer().positive().required().messages({
    'number.base': '用户ID必须是数字',
    'number.integer': '用户ID必须是整数',
    'number.positive': '用户ID必须是正数',
    'any.required': '用户ID不能为空'
  }),
  status: Joi.string().valid('active', 'inactive', 'banned').required().messages({
    'any.only': '用户状态只能是active、inactive或banned',
    'any.required': '用户状态不能为空'
  })
});

// 获取用户列表数据验证规则
const getUsersSchema = Joi.object({
  page: Joi.number().integer().min(1).default(1).messages({
    'number.base': '页码必须是数字',
    'number.integer': '页码必须是整数',
    'number.min': '页码必须大于0'
  }),
  pageSize: Joi.number().integer().min(1).max(100).default(10).messages({
    'number.base': '每页数量必须是数字',
    'number.integer': '每页数量必须是整数',
    'number.min': '每页数量必须大于0',
    'number.max': '每页数量不能超过100'
  }),
  keyword: Joi.string().max(100).optional().allow('').messages({
    'string.max': '搜索关键词不能超过100个字符'
  }),
  status: Joi.string().valid('all', 'active', 'inactive', 'banned').default('all').messages({
    'any.only': '状态筛选只能是all、active、inactive或banned'
  }),
  sortBy: Joi.string().valid('created_at', 'last_login_time', 'login_count', 'name').default('created_at').messages({
    'any.only': '排序字段只能是created_at、last_login_time、login_count或name'
  }),
  sortOrder: Joi.string().valid('asc', 'desc').default('desc').messages({
    'any.only': '排序方式只能是asc或desc'
  }),
  _t: Joi.number().integer().optional().messages({
    'number.base': '时间戳参数必须是数字',
    'number.integer': '时间戳参数必须是整数'
  })
});

// 管理员修改用户信息数据验证规则
const adminUpdateUserSchema = Joi.object({
  userId: Joi.number().integer().positive().required().messages({
    'number.base': '用户ID必须是数字',
    'number.integer': '用户ID必须是整数',
    'number.positive': '用户ID必须是正数',
    'any.required': '用户ID不能为空'
  }),
  name: Joi.string().max(100).optional().allow('').messages({
    'string.max': '姓名不能超过100个字符'
  }),
  idCard: Joi.string().pattern(/^[1-9]\d{5}(18|19|20)\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/).optional().allow('').messages({
    'string.pattern.base': '身份证号码格式不正确'
  }),
  gender: Joi.string().valid('male', 'female', 'secrecy').optional().allow('').messages({
    'any.only': '性别只能是male、female或secrecy'
  }),
  birthDate: Joi.date().optional().allow('').messages({
    'date.base': '出生日期格式不正确'
  }),
  phone: Joi.string().pattern(/^1[3-9]\d{9}$/).optional().allow('').messages({
    'string.pattern.base': '手机号格式不正确'
  }),
  email: Joi.string().email().optional().allow('').messages({
    'string.email': '邮箱格式不正确'
  }),
  province: Joi.string().max(50).optional().allow('').messages({
    'string.max': '省份不能超过50个字符'
  }),
  city: Joi.string().max(50).optional().allow('').messages({
    'string.max': '城市不能超过50个字符'
  }),
  county: Joi.string().max(50).optional().allow('').messages({
    'string.max': '县区不能超过50个字符'
  }),
  village: Joi.string().max(100).optional().allow('').messages({
    'string.max': '村庄不能超过100个字符'
  }),
  address: Joi.string().max(200).optional().allow('').messages({
    'string.max': '详细地址不能超过200个字符'
  }),
  postalCode: Joi.string().pattern(/^\d{6}$/).optional().allow('').messages({
    'string.pattern.base': '邮政编码格式不正确'
  }),
  status: Joi.string().valid('active', 'inactive', 'banned').optional().messages({
    'any.only': '用户状态只能是active、inactive或banned'
  })
});

// 删除用户数据验证规则
const deleteUserSchema = Joi.object({
  userId: Joi.number().integer().positive().required().messages({
    'number.base': '用户ID必须是数字',
    'number.integer': '用户ID必须是整数',
    'number.positive': '用户ID必须是正数',
    'any.required': '用户ID不能为空'
  }),
  confirmDelete: Joi.boolean().valid(true).required().messages({
    'any.only': '必须确认删除操作',
    'any.required': '确认删除参数不能为空'
  })
});

module.exports = {
  registerSchema,
  loginSchema,
  resetPasswordSchema,
  validateUserSchema,
  updateProfileSchema,
  bindEmailSchema,
  unbindEmailSchema,
  disableUserSchema,
  getUsersSchema,
  adminUpdateUserSchema,
  deleteUserSchema
};